package com.briup.smartcity_group1.service.impl;

import com.briup.smartcity_group1.bean.basic.BaseConfig;
import com.briup.smartcity_group1.consts.BaseConfigDbConsts;
import com.briup.smartcity_group1.dao.basic.BaseConfigMapper;
import com.briup.smartcity_group1.dao.ext.BaseConfigExtMapper;
import com.briup.smartcity_group1.exception.ServiceException;
import com.briup.smartcity_group1.service.IBaseConfigService;
import com.briup.smartcity_group1.utils.result.ResultCode;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author WangChen
 * @date 2023/1/5 10:37
 */
@Service
public class BaseConfigServiceImpl implements IBaseConfigService {

    @Autowired
    private BaseConfigMapper mapper;
    @Autowired
    private BaseConfigExtMapper extMapper;

    /**
     * 保存配置信息
     *
     * @param baseConfig 待保存的配置类对象
     */
    @Override
    public void saveConfig(BaseConfig baseConfig) {
        mapper.insert(baseConfig);
    }

    /**
     * 更新配置信息
     * 该接口不会更新配置状态
     *
     * @param baseConfig 待更新的配置类对象
     */
    @Override
    public void updateConfig(BaseConfig baseConfig) {

        int id = baseConfig.getConfigId();
        if (mapper.selectByPrimaryKey(id) == null){
            throw new ServiceException(ResultCode.BASE_CONFIG_NOT_FOUND);
        }

        //将状态信息置空,防止恶意修改状态信息
        baseConfig.setConfigStatus(null);

        mapper.updateByPrimaryKeySelective(baseConfig);
    }

    /**
     * 改变配置信息的状态
     * <p>
     * 1.不能将所有的配置信息状态全部设置为禁用状态
     * 2.配置信息的状态在整个系统中只且只有一个配置信息状态为开启。
     * </p>
     * @param id     配置信息的id
     * @param status 配置信息信息的状态
     */
    @Override
    public void changeConfigStatus(int id, int status) {

        if (status == BaseConfigDbConsts.DISABLED){
            throw new ServiceException(ResultCode.BASE_CONFIG_STATUS_LIMIT_MIN);
        }

        //开启另一则配置信息的同时将已开启的配置信息关闭
        if (status == BaseConfigDbConsts.ENABLED){
            //关闭旧配置信息
            BaseConfig enabledBaseConfig = extMapper.selectByYes();

            enabledBaseConfig.setConfigStatus(BaseConfigDbConsts.DISABLED);
            mapper.updateByPrimaryKeySelective(enabledBaseConfig);

            //开启要开启的配置信息
            BaseConfig toEnabledBaseConfig  = mapper.selectByPrimaryKey(id);
            toEnabledBaseConfig.setConfigStatus(status);
            mapper.updateByPrimaryKeySelective(toEnabledBaseConfig);
        }


    }

    /**
     * 根据id删除删除配置信息
     * <p>
     * 1.如果系统中只有一个配置信息，提示用户无法删除
     * 2.如果删除状态为启用的配置信息，提示用户禁用后才能删除该配置信息
     * </p>
     *
     * @param id 要删除的配置信息的id
     */
    @Override
    public void deleteById(int id) {

        if (BaseConfigDbConsts.LIMIT_MIN == extMapper.count()){
            throw new ServiceException(ResultCode.BASE_CONFIG_DELETE_LIMIT_MIN);
        }

        BaseConfig baseConfig = mapper.selectByPrimaryKey(id);
        if (BaseConfigDbConsts.ENABLED == baseConfig.getConfigStatus() ){
            throw new ServiceException(ResultCode.BASE_CONFIG_DELETE_LIMIT_ENABLED);
        }

        mapper.deleteByPrimaryKey(id);
    }

    /**
     * 分页询所有配置信息
     *
     * @param pageNum   页码
     * @param pageSize  页面大小
     * @return 分页查询的结果集, 装有对应页的配置信息对象
     */
    @Override
    public PageInfo<BaseConfig> findAllWithPage(int pageNum, int pageSize) {

        PageInfo<BaseConfig> pageInfo = PageHelper.startPage(pageNum, pageSize, true).doSelectPageInfo(
                () -> extMapper.selectAll()
        );
        return pageInfo;
    }

    /**
     * 查找当前启用的配置信息
     * <p>
     * 查询到的配置信息会作为系统的首页的系统名字使用。
     * 所以显示的结果只能为一条数据
     * </p>
     *
     * @return 当前启用的配置信息对象
     */
    @Override
    public BaseConfig currentConfigYes() {
        return extMapper.selectByYes();
    }
}
